import { dayjs } from 'element-plus';

/**
 * 获取扫描日期
 * @param num 扫描日期
 * @returns 格式化后的日期字符串
 */
export function GetScanDate(num: number | string): string {
	// 先转化为字符串
	let dateNum = num.toString();
	// 提取各个部分
	let year = 2000 + parseInt(dateNum.slice(0, 3));
	let monthAndDate = parseInt(dateNum.slice(3, 6));
	let hour = dateNum.slice(6, 8);
	let minutes = dateNum.slice(8, 10);

	/**
	 * 判断是否为闰年
	 * @param yearNum 年份
	 * @returns 是否为闰年
	 */
	function IsLeapYear(yearNum: number): boolean {
		if ((yearNum % 4 === 0 && yearNum % 100 !== 0) || yearNum % 400 === 0) {
			console.log('闰年，2月份29天');
			return true;
		} else {
			console.log('平年，2月份28天');
			return false;
		}
	}
	/**
	 * 计算月份和日期
	 * @param strMon 月份字符串
	 * @param num 天数
	 * @param tagNum 闰年2月份的天数
	 * @param addNum 累加天数
	 * @returns 月份和日期字符串
	 */
	function ComputeMonthAndDate(strMon: string, num: number, tagNum: number, addNum: number): string {
		return `${strMon}-${num - (tagNum + addNum) < 10 ? '0' + (num - (tagNum + addNum)) : num - (tagNum + addNum)}`;
	}
	/**
	 * 获取月份和日期字符串
	 * @param num 天数
	 * @param isLeapYear 是否为闰年
	 * @returns 月份和日期字符串
	 */
	function GetMonthAndDate(num: number, isLeapYear: boolean): string {
		let monthAndDateStr: string = '';
		let tagNum: number;
		isLeapYear ? (tagNum = 60) : (tagNum = 59);
		if (num <= 31) {
			monthAndDateStr = `01-${num <= 10 ? '0' + num : num}`;
		} else if (31 < num && num <= tagNum) {
			monthAndDateStr = `02-${num - 31 <= 10 ? '0' + (num - 31) : num - 31}`
		} else if (tagNum < num && num <= tagNum + 31) {
			monthAndDateStr = `03-${num - tagNum <= 10 ? '0' + (num - tagNum) : num - tagNum}`;
		} else if (tagNum + 31 < num && num <= tagNum + 61) {
			monthAndDateStr = ComputeMonthAndDate('04', num, tagNum, 31);
		} else if (tagNum + 61 < num && num <= tagNum + 92) {
			monthAndDateStr = ComputeMonthAndDate('05', num, tagNum, 61);
		} else if (tagNum + 92 < num && num <= tagNum + 122) {
			monthAndDateStr = ComputeMonthAndDate('06', num, tagNum, 92);
		} else if (tagNum + 122 < num && num <= tagNum + 153) {
			monthAndDateStr = ComputeMonthAndDate('07', num, tagNum, 122);
		} else if (tagNum + 153 < num && num <= tagNum + 184) {
			monthAndDateStr = ComputeMonthAndDate('08', num, tagNum, 153);
		} else if (tagNum + 184 < num && num <= tagNum + 214) {
			monthAndDateStr = ComputeMonthAndDate('09', num, tagNum, 184);
		} else if (tagNum + 214 < num && num <= tagNum + 245) {
			monthAndDateStr = ComputeMonthAndDate('10', num, tagNum, 214);
		} else if (tagNum + 245 < num && num <= tagNum + 275) {
			monthAndDateStr = ComputeMonthAndDate('11', num, tagNum, 245);
		} else if (tagNum + 275 < num && num <= tagNum + 306) {
			monthAndDateStr = ComputeMonthAndDate('12', num, tagNum, 275);
		} else {
			console.log('时间有误，超出366天');
		}

		return monthAndDateStr;
	}

	return `${year}-${GetMonthAndDate(monthAndDate, IsLeapYear(year))} ${hour}:${minutes}`;
}

/**
 * 格式化日期字符串
 * @param value 日期字符串
 * @returns 格式化后的日期字符串 YYYY-MM-DD HH:mm
 */
export function formatDateString(value: string): string {
	var pattern = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/;
	let date = value.replace(pattern, '$1-$2-$3 $4:$5');
	return date;
}

/**
 * 格式化日期（默认 年-月-日 时:分:秒）
 * @param str 日期
 * @param isDate 是否转为 年-月-日
 * @param isMinutes 是否转为 年-月-日 时:分
 * @param isTime 是否转为 时:分:秒
 * @returns
 */
export function dateFormatter(str: string | Date, isDate: boolean = false, isMinutes: boolean = false, isTime: boolean = false) {
	if (str == undefined || str == null || str == '') {
		return undefined;
	}

	if (isDate === true) {
		return dayjs(str).format('YYYY-MM-DD');
	} else if (isMinutes === true) {
		return dayjs(str).format('YYYY-MM-DD HH:mm');
	} else if (isTime === true) {
		return dayjs(str).format('HH:mm:ss');
	} else {
		return dayjs(str).format('YYYY-MM-DD HH:mm:ss');
	}
}

/**
 * 设置开始时间
 * @param dataKuaDu 日期跨度，默认0，即当天
 * @returns
 */
export function getStartTime(dataKuaDu: number = 0) {
	const curDate = new Date();
	const startTime = new Date(curDate.getTime() - 24 * 60 * 60 * 1000 * dataKuaDu);
	startTime.setHours(0);
	startTime.setMinutes(0);
	startTime.setSeconds(0);
	startTime.setMilliseconds(0);

	return dateFormatter(startTime);
}
/**
 * 设置结束时间
 * @returns
 */
export function getEndTime() {
	const endTime = new Date();
	endTime.setHours(23);
	endTime.setMinutes(59);
	endTime.setSeconds(59);
	endTime.setMilliseconds(999);
	return dateFormatter(endTime);
}

/**
 * 时间日期转换
 * @param date 当前时间，new Date() 格式
 * @param format 需要转换的时间格式字符串
 * @description format 字符串随意，如 `YYYY-mm、YYYY-mm-dd`
 * @description format 季度："YYYY-mm-dd HH:MM:SS QQQQ"
 * @description format 星期："YYYY-mm-dd HH:MM:SS WWW"
 * @description format 几周："YYYY-mm-dd HH:MM:SS ZZZ"
 * @description format 季度 + 星期 + 几周："YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ"
 * @returns 返回拼接后的时间字符串
 */
export function formatDate(date0: Date | String, format: string = 'YYYY-mm-dd HH:MM'): string {
	var date = new Date();
	if (date0 === undefined || date0 === null) {
		return '';
	} else if (typeof date0 === 'string') {
		date = new Date(date0);
		if (isNaN(date.getTime())) {
			return date0;
		}
	} else {
		date = date0 as Date;
	}

	let we = date.getDay(); // 星期
	let z = getWeek(date); // 周
	let qut = Math.floor((date.getMonth() + 3) / 3).toString(); // 季度
	const opt: { [key: string]: string } = {
		'Y+': date.getFullYear().toString(), // 年
		'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始，要+1)
		'd+': date.getDate().toString(), // 日
		'H+': date.getHours().toString(), // 时
		'M+': date.getMinutes().toString(), // 分
		'S+': date.getSeconds().toString(), // 秒
		'q+': qut, // 季度
	};
	// 中文数字 (星期)
	const week: { [key: string]: string } = {
		'0': '日',
		'1': '一',
		'2': '二',
		'3': '三',
		'4': '四',
		'5': '五',
		'6': '六',
	};
	// 中文数字（季度）
	const quarter: { [key: string]: string } = {
		'1': '一',
		'2': '二',
		'3': '三',
		'4': '四',
	};
	if (/(W+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]);
	if (/(Q+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut]);
	if (/(Z+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 3 ? '第' + z + '周' : z + '');
	for (let k in opt) {
		let r = new RegExp('(' + k + ')').exec(format);
		// 若输入的长度不为1，则前面补零
		if (r) format = format.replace(r[1], RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0'));
	}
	return format;
}

/**
 * 获取当前日期是第几周
 * @param dateTime 当前传入的日期值
 * @returns 返回第几周数字值
 */
export function getWeek(dateTime: Date): number {
	let temptTime = new Date(dateTime.getTime());
	// 周几
	let weekday = temptTime.getDay() || 7;
	// 周1+5天=周六
	temptTime.setDate(temptTime.getDate() - weekday + 1 + 5);
	let firstDay = new Date(temptTime.getFullYear(), 0, 1);
	let dayOfWeek = firstDay.getDay();
	let spendDay = 1;
	if (dayOfWeek != 0) spendDay = 7 - dayOfWeek + 1;
	firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay);
	let d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86400000);
	let result = Math.ceil(d / 7);
	return result;
}

/**
 * 将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前`
 * @param param 当前时间，new Date() 格式或者字符串时间格式
 * @param format 需要转换的时间格式字符串
 * @description param 10秒：  10 * 1000
 * @description param 1分：   60 * 1000
 * @description param 1小时： 60 * 60 * 1000
 * @description param 24小时：60 * 60 * 24 * 1000
 * @description param 3天：   60 * 60* 24 * 1000 * 3
 * @returns 返回拼接后的时间字符串
 */
export function formatPast(param: string | Date, format: string = 'YYYY-mm-dd'): string {
	// 传入格式处理、存储转换值
	let t: any, s: number;
	// 获取js 时间戳
	let time: number = new Date().getTime();
	// 是否是对象
	typeof param === 'string' || 'object' ? (t = new Date(param).getTime()) : (t = param);
	// 当前时间戳 - 传入时间戳
	time = Number.parseInt(`${time - t}`);
	if (time < 10000) {
		// 10秒内
		return '刚刚';
	} else if (time < 60000 && time >= 10000) {
		// 超过10秒少于1分钟内
		s = Math.floor(time / 1000);
		return `${s}秒前`;
	} else if (time < 3600000 && time >= 60000) {
		// 超过1分钟少于1小时
		s = Math.floor(time / 60000);
		return `${s}分钟前`;
	} else if (time < 86400000 && time >= 3600000) {
		// 超过1小时少于24小时
		s = Math.floor(time / 3600000);
		return `${s}小时前`;
	} else if (time < 259200000 && time >= 86400000) {
		// 超过1天少于3天内
		s = Math.floor(time / 86400000);
		return `${s}天前`;
	} else {
		// 超过3天
		let date = typeof param === 'string' || 'object' ? new Date(param) : param;
		return formatDate(date, format);
	}
}

/**
 * 时间问候语
 * @param param 当前时间，new Date() 格式
 * @description param 调用 `formatAxis(new Date())` 输出 `上午好`
 * @returns 返回拼接后的时间字符串
 */
export function formatAxis(param: Date): string {
	let hour: number = new Date(param).getHours();
	if (hour < 6) return '凌晨好';
	else if (hour < 9) return '早上好';
	else if (hour < 12) return '上午好';
	else if (hour < 14) return '中午好';
	else if (hour < 17) return '下午好';
	else if (hour < 19) return '傍晚好';
	else if (hour < 22) return '晚上好';
	else return '夜里好';
}
